/**
 * 使用node + jwt搭建的基于token的身份校验
 * 基于Token的身份验证的过程如下:
 *  1. 登陆时，客户端发送用户名密码
 *  2. 服务端验证用户名密码是否正确，校验通过就会生成一个有时效的token串，发送给客户端
 *  3. 客户端储存token,一般都会存储在localStorage或者cookie里面
 *  4. 客户端每次请求时都带有token，可以将其放在请求头里，每次请求都携带token
 *  5. 服务端验证token，所有需要校验身份的接口都会被校验token，若token解析后的数据包含用户身份信息，则身份验证通过，返回数据
 */
// 引入模块依赖
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');  // npm i jsonwebtoken 安装jsonwebtoken模块

let secret = 'qianming';  //签名, 解码时要使用到

// 创建token类
class Jwt {
    constructor(data) {
        this.data= data;
    }

    // 生成token
    generateToken() {
        let data= this.data;
        let created= Math.floor(Date.now() / 1000);  // token的创建时间
        // let certificate= fs.readFileSync(path.join(__dirname, '../config/private_key.pem'));  // 私钥 可以自己生成
        let token= jwt.sign({
            data,
            expire: created + 60 * 60  // 到期时间为1小时
        // }, certificate, { algorithm: 'RS256' });
        }, secret);
        return token;
    }

    // 校验token
    verifyToken() {
        let token= this.data;
        // let certificate= fs.readFileSync(path.join(__dirname, '../config/public_key.pem'));  // 公钥 可以自己生成
        let res= '';
        try {
            // let result= jwt.verify(token, certificate, { algorithms: ['RS256'] }) || {};
            let result= jwt.verify(token, secret) || {};
            let {expire= 0}= result, current= Math.floor(Date.now() / 1000);
            if(current < expire) {
                res= result.data || {};
            }
        } catch (e) {
            res= 'error';
        }
        return res;
    }
}


module.exports= Jwt;
